/********************************
* name:	数据存储管理模块头文件
* func:	数据存储系统相关函数声明
********************************/
#ifndef __DATA_STORAGE_H
#define __DATA_STORAGE_H

#include "bsp_system.h"

/*=============================================================================
 * 函数声明
 *============================================================================*/

/**
 * @brief 存储系统初始化函数
 * @return: 0-成功，-1-失败
 * 
 * 功能：
 * - 创建所需文件夹（sample, overLimit, log, hideData）
 * - 初始化上电次数计数器
 * - 创建本次上电的日志文件
 * 
 * 使用方法：在系统启动时调用一次
 */
int storage_system_init(void);

/**
 * @brief 存储采样数据主接口
 * @param voltage: 当前电压值
 * @param limit_value: 设定的限制阈值  
 * @param timestamp: 当前时间戳
 * @return: 0-成功，-1-失败
 * 
 * 功能：
 * - 根据模式保存数据到相应文件夹
 * - 正常模式：保存到sample文件夹
 * - 隐藏模式：保存到hideData文件夹
 * - 超限数据：额外保存到overLimit文件夹
 * - 记录操作日志
 */
int store_sampling_data(float voltage, float limit_value, uint32_t timestamp);

/**
 * @brief 记录操作日志便捷接口
 * @param operation: 操作名称（如"RTC_CONFIG", "RATIO_SET"等）
 * @param result: 操作结果描述
 * 
 * 功能：
 * - 记录系统操作到日志文件
 * - 用于审计跟踪
 * 
 * 使用示例：
 * storage_log_operation("RTC_CONFIG", "Time set to 2025-01-01 15:00:10");
 */
void storage_log_operation(const char* operation, const char* result);

/**
 * @brief 数据存储任务函数（用于调度器）
 * 
 * 功能：
 * - 检查采样状态
 * - 自动存储采样数据
 * - 集成到调度器系统中
 * 
 * 使用方法：添加到scheduler_task数组中
 */
void data_storage_task(void);

/**
 * @brief 获取当前Unix时间戳
 * @return: 当前Unix时间戳
 * 
 * 功能：
 * - 从RTC获取时间并转换为Unix时间戳
 * - 自动调整时区
 */
uint32_t get_current_timestamp(void);

/**
 * @brief 关闭存储系统
 * 
 * 功能：
 * - 关闭所有打开的文件
 * - 清理资源
 * - 在系统关闭前调用
 */
void storage_system_close(void);

/*=============================================================================
 * 内部函数声明（用于模块化管理）
 *============================================================================*/

/**
 * @brief 创建新的sample数据文件
 * @return: 0-成功，-1-失败
 */
int create_new_sample_file(void);

/**
 * @brief 创建新的overLimit数据文件  
 * @return: 0-成功，-1-失败
 */
int create_new_overlimit_file(void);

/**
 * @brief 创建日志文件
 * @return: 0-成功，-1-失败
 */
int create_log_file(void);

/**
 * @brief 创建新的hideData文件
 * @return: 0-成功，-1-失败
 */
int create_new_hidedata_file(void);

/**
 * @brief 从Flash读取上电次数
 * @return: 上电次数
 */
uint32_t read_boot_count_from_flash(void);

/**
 * @brief 将上电次数写入Flash
 * @param count: 上电次数
 */
void write_boot_count_to_flash(uint32_t count);

/**
 * @brief 获取时间字符串（用于文件命名）
 * @param datetime_str: 输出缓冲区
 */
void get_datetime_string(char* datetime_str);

/**
 * @brief 转换为HEX格式
 * @param timestamp: 时间戳
 * @param voltage: 电压值
 * @param hex_str: 输出缓冲区
 */
void convert_to_hex_format(uint32_t timestamp, float voltage, char* hex_str);
int log_operation(const char* operation, const char* result);
#endif /* __DATA_STORAGE_H */